%s - ",(global_opts.synthesize_shortnames) ? CSTR(mkshort_from_wpt(mkshort_handle, wpt)) : CSTR(wpt->shortname));
- char* cout = pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", 1);
- gbfprintf(file_out, "%s (%d%c %6.0f %7.0f)", cout, utmz, utmzc, utme, utmn);
- xfree(cout);
+ gbfprintf(file_out, "%s (%d%c %6.0f %7.0f)",
+ CSTR(pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", true)),
+ utmz, utmzc, utme, utmn);
if (wpt->altitude != unknown_alt) {
gbfprintf(file_out, " alt:%d", (int)((altunits[0]=='f')?METERS_TO_FEET(wpt->altitude):wpt->altitude));
}
@@ -161,11 +161,9 @@ HtmlFormat::html_disp(const Waypoint* wpt) const
if (logpart) {
double lat = xml_attribute(logpart->attributes, "lat").toDouble();
double lon = xml_attribute(logpart->attributes, "lon").toDouble();
- char* coordstr = pretty_deg_format(lat, lon, degformat[2], " ", 1);
gbfprintf(file_out,
"%s \n",
- coordstr);
- xfree(coordstr);
+ CSTR(pretty_deg_format(lat, lon, degformat[2], " ", true)));
}
logpart = xml_findfirst(curlog, "groundspeak:text");
diff --git a/reference/garmin_gpi_position~gpx.gpi b/reference/garmin_gpi_position~gpx.gpi
new file mode 100644
index 0000000000000000000000000000000000000000..7991d7cc8893f29e2844b4e863f372854daf99c4
GIT binary patch
literal 11818
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
M|1%muGq6AZ1^iL53IG5A
literal 0
HcmV?d00001
diff --git a/reference/pretty_degree.csv b/reference/pretty_degree.csv
new file mode 100644
index 000000000..d64d9aac4
--- /dev/null
+++ b/reference/pretty_degree.csv
@@ -0,0 +1,9 @@
+lat|lon|desc
+0.134°S|0.135°W|point0
+0.134°N|0.135°E|point1
+1.134°S|1.135°W|point2
+1.134°N|1.135°E|point3
+10.134°S|10.135°W|point4
+10.134°N|10.135°E|point5
+80.134°S|100.135°W|point6
+80.134°N|100.135°E|point7
diff --git a/reference/pretty_degree0.csv b/reference/pretty_degree0.csv
new file mode 100644
index 000000000..03c62fd22
--- /dev/null
+++ b/reference/pretty_degree0.csv
@@ -0,0 +1,9 @@
+No,Latitude,Longitude,Name
+1,S0.13400,W0.13500,"point0"
+2,N0.13400,E0.13500,"point1"
+3,S1.13400,W1.13500,"point2"
+4,N1.13400,E1.13500,"point3"
+5,S10.13400,W10.13500,"point4"
+6,N10.13400,E10.13500,"point5"
+7,S80.13400,W100.13500,"point6"
+8,N80.13400,E100.13500,"point7"
diff --git a/reference/pretty_degree1.csv b/reference/pretty_degree1.csv
new file mode 100644
index 000000000..e6a41b4f8
--- /dev/null
+++ b/reference/pretty_degree1.csv
@@ -0,0 +1,9 @@
+No,Latitude,Longitude,Name
+1,S0 08.040,W0 08.100,"point0"
+2,N0 08.040,E0 08.100,"point1"
+3,S1 08.040,W1 08.100,"point2"
+4,N1 08.040,E1 08.100,"point3"
+5,S10 08.040,W10 08.100,"point4"
+6,N10 08.040,E10 08.100,"point5"
+7,S80 08.040,W100 08.100,"point6"
+8,N80 08.040,E100 08.100,"point7"
diff --git a/reference/pretty_degree2.csv b/reference/pretty_degree2.csv
new file mode 100644
index 000000000..52c969efb
--- /dev/null
+++ b/reference/pretty_degree2.csv
@@ -0,0 +1,9 @@
+No,Latitude,Longitude,Name
+1,"S0 08'02.4""","W0 08'06.0""","point0"
+2,"N0 08'02.4""","E0 08'06.0""","point1"
+3,"S1 08'02.4""","W1 08'06.0""","point2"
+4,"N1 08'02.4""","E1 08'06.0""","point3"
+5,"S10 08'02.4""","W10 08'06.0""","point4"
+6,"N10 08'02.4""","E10 08'06.0""","point5"
+7,"S80 08'02.4""","W100 08'06.0""","point6"
+8,"N80 08'02.4""","E100 08'06.0""","point7"
diff --git a/testo.d/garmin_gpi.test b/testo.d/garmin_gpi.test
index 15df6508e..a58c3b175 100644
--- a/testo.d/garmin_gpi.test
+++ b/testo.d/garmin_gpi.test
@@ -31,6 +31,10 @@ compare ${TMPDIR}/garmin_gpi_encoding.gpx ${TMPDIR}/garmin_gpi_encoding2.gpi.gpx
gpsbabel -i gpx -f ${REFERENCE}/garmin_gpi.gpx -o garmin_gpi,category="VinÃcolas",hide -F ${TMPDIR}/garmin_gpi_category~gpx.gpi
compare ${REFERENCE}/garmin_gpi_category~gpx.gpi ${TMPDIR}/garmin_gpi_category~gpx.gpi
+# check position option
+gpsbabel -i gpx -f ${REFERENCE}/garmin_gpi.gpx -o garmin_gpi,position -F ${TMPDIR}/garmin_gpi_position~gpx.gpi
+compare ${REFERENCE}/garmin_gpi_position~gpx.gpi ${TMPDIR}/garmin_gpi_position~gpx.gpi
+
# check dual language read
# spb_metro_norm.gpi from https://www.garmin.ru/download/extras/poi.php or https://files.navicom.ru/spb_metro_norm.gpi
gpsbabel -i garmin_gpi,languagecode=RU -f ${REFERENCE}/spb_metro_norm.gpi -o gpx -F ${TMPDIR}/spb_metro_norm_ru~gpi.gpx
diff --git a/testo.d/unicsv.test b/testo.d/unicsv.test
index 63de3e97d..6c31bba94 100644
--- a/testo.d/unicsv.test
+++ b/testo.d/unicsv.test
@@ -46,3 +46,11 @@ gpsbabel -i unicsv -f ${REFERENCE}/humantodec1.csv -o gpx -F ${TMPDIR}/humantode
compare ${REFERENCE}/humantodec.gpx ${TMPDIR}/humantodec1.gpx
gpsbabel -i unicsv -f ${REFERENCE}/humantodec2.csv -o gpx -F ${TMPDIR}/humantodec2.gpx
compare ${REFERENCE}/humantodec.gpx ${TMPDIR}/humantodec2.gpx
+
+# pretty degree format
+gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=0 -F ${TMPDIR}/pretty_degree0.csv
+compare ${REFERENCE}/pretty_degree0.csv ${TMPDIR}/pretty_degree0.csv
+gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=1 -F ${TMPDIR}/pretty_degree1.csv
+compare ${REFERENCE}/pretty_degree1.csv ${TMPDIR}/pretty_degree1.csv
+gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=2 -F ${TMPDIR}/pretty_degree2.csv
+compare ${REFERENCE}/pretty_degree2.csv ${TMPDIR}/pretty_degree2.csv
diff --git a/text.cc b/text.cc
index 9b5e478ca..313c379c0 100644
--- a/text.cc
+++ b/text.cc
@@ -77,18 +77,18 @@ TextFormat::text_disp(const Waypoint* wpt)
GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
&utme, &utmn, &utmz, &utmzc);
- char* tmpout1 = pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", 0);
if (wpt->altitude != unknown_alt) {
xasprintf(&altout, " alt:%d", (int)((altunits[0]=='f')?METERS_TO_FEET(wpt->altitude):wpt->altitude));
} else {
altout = (char*) "";
}
- xasprintf(&tmpout2, "%s (%d%c %6.0f %7.0f)%s", tmpout1, utmz, utmzc, utme, utmn, altout);
+ xasprintf(&tmpout2, "%s (%d%c %6.0f %7.0f)%s",
+ CSTR(pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", false)),
+ utmz, utmzc, utme, utmn, altout);
gbfprintf(file_out, "%-16s %59s\n",
(global_opts.synthesize_shortnames) ? CSTR(mkshort_from_wpt(mkshort_handle, wpt)) : CSTR(wpt->shortname),
tmpout2);
xfree(tmpout2);
- xfree(tmpout1);
if (altout[0]) {
xfree(altout);
}
@@ -168,9 +168,8 @@ TextFormat::text_disp(const Waypoint* wpt)
if (logpart) {
double lat = xml_attribute(logpart->attributes, "lat").toDouble();
double lon = xml_attribute(logpart->attributes, "lon").toDouble();
- char* coordstr = pretty_deg_format(lat, lon, degformat[2], " ", 0);
- gbfprintf(file_out, "%s\n", coordstr);
- xfree(coordstr);
+ gbfprintf(file_out, "%s\n",
+ CSTR(pretty_deg_format(lat, lon, degformat[2], " ", false)));
}
logpart = xml_findfirst(curlog, "groundspeak:text");
diff --git a/unicsv.cc b/unicsv.cc
index 6788f6dac..b88fc9a03 100644
--- a/unicsv.cc
+++ b/unicsv.cc
@@ -1113,7 +1113,7 @@ UnicsvFormat::unicsv_fatal_outside(const Waypoint* wpt) const
*fout << "#####\n";
fatal(MYNAME ": %s (%s) is outside of convertible area of grid \"%s\"!\n",
wpt->shortname.isEmpty() ? "Waypoint" : qPrintable(wpt->shortname),
- pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, 0),
+ qPrintable(pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, false)),
gt_get_mps_grid_longname(unicsv_grid_idx, MYNAME));
}
@@ -1306,7 +1306,6 @@ void
UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt)
{
double lat, lon, alt;
- char* cout = nullptr;
const geocache_data* gc_data = nullptr;
unicsv_waypt_ct++;
@@ -1327,22 +1326,19 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt)
switch (unicsv_grid_idx) {
case grid_lat_lon_ddd:
- cout = pretty_deg_format(lat, lon, 'd', unicsv_fieldsep, 0);
- *fout << cout;
+ *fout << pretty_deg_format(lat, lon, 'd', unicsv_fieldsep, false);
break;
case grid_lat_lon_dmm:
- cout = pretty_deg_format(lat, lon, 'm', unicsv_fieldsep, 0);
- *fout << cout;
+ *fout << pretty_deg_format(lat, lon, 'm', unicsv_fieldsep, false);
break;
case grid_lat_lon_dms: {
- cout = pretty_deg_format(lat, lon, 's', unicsv_fieldsep, 0);
- char* sep = strchr(cout, ',');
- *sep = '\0';
- QString tmp = csv_enquote(cout, kUnicsvQuoteChar);
+ QString position = pretty_deg_format(lat, lon, 's', unicsv_fieldsep, false);
+ auto sep = position.indexOf(unicsv_fieldsep);
+ QString tmp = csv_enquote(position.left(sep), kUnicsvQuoteChar);
*fout << tmp << unicsv_fieldsep;
- tmp = csv_enquote(sep+1, kUnicsvQuoteChar);
+ tmp = csv_enquote(position.mid(sep+1), kUnicsvQuoteChar);
*fout << tmp;
}
break;
@@ -1393,10 +1389,6 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt)
break;
}
- if (cout) {
- xfree(cout);
- }
-
if FIELD_USED(fld_shortname) {
unicsv_print_str(shortname);
}
diff --git a/util.cc b/util.cc
index 981972dae..362b680a9 100644
--- a/util.cc
+++ b/util.cc
@@ -1123,10 +1123,10 @@ convert_human_time_format(const char* human_timef)
* sep = string between lat and lon (separator)
* html = 1 for html output otherwise text
*/
-char*
-pretty_deg_format(double lat, double lon, char fmt, const char* sep, int html)
+QString
+pretty_deg_format(double lat, double lon, char fmt, const char* sep, bool html)
{
- char* result;
+ QString result;
char latsig = lat < 0 ? 'S':'N';
char lonsig = lon < 0 ? 'W':'E';
int latint = abs((int) lat);
@@ -1139,17 +1139,17 @@ pretty_deg_format(double lat, double lon, char fmt, const char* sep, int html)
sep = " "; /* default " " */
}
if (fmt == 'd') { /* ddd */
- xasprintf(&result, "%c%6.5f%s%s%c%6.5f%s",
- latsig, fabs(lat), html?"°":"", sep,
- lonsig, fabs(lon), html?"°":"");
+ result = QStringLiteral("%1%2%3%4%5%6%7")
+ .arg(latsig).arg(fabs(lat), 6, 'f', 5).arg(html ? "°" : "", sep)
+ .arg(lonsig).arg(fabs(lon), 6, 'f', 5).arg(html ? "°" : "");
} else if (fmt == 's') { /* dms */
- xasprintf(&result, "%c%d%s%02d'%04.1f\"%s%c%d%s%02d'%04.1f\"",
- latsig, latint, html?"°":" ", (int)latmin, latsec, sep,
- lonsig, lonint, html?"°":" ", (int)lonmin, lonsec);
+ result = QStringLiteral("%1%2%3%4'%5\"%6%7%8%9%10'%11\"")
+ .arg(latsig).arg(latint).arg(html ? "°" : " ").arg((int)latmin, 2, 10, QChar('0')).arg(latsec, 4, 'f', 1, QChar('0')).arg(sep)
+ .arg(lonsig).arg(lonint).arg(html ? "°" : " ").arg((int)lonmin, 2, 10, QChar('0')).arg(lonsec, 4, 'f', 1, QChar('0'));
} else { /* default dmm */
- xasprintf(&result, "%c%d%s%06.3f%s%c%d%s%06.3f",
- latsig, latint, html?"°":" ", latmin, sep,
- lonsig, lonint, html?"°":" ", lonmin);
+ result = QStringLiteral("%1%2%3%4%5%6%7%8%9")
+ .arg(latsig).arg(latint).arg(html ? "°" : " ").arg(latmin, 6, 'f', 3, QChar('0')).arg(sep)
+ .arg(lonsig).arg(lonint).arg(html ? "°" : " ").arg(lonmin, 6, 'f', 3, QChar('0'));
}
return result;
}
--
2.30.2
|